package lessons.no6;

import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * Map 集合 HashMap
 */
public class N6_6 {
    
    public static void main(String[] args) {
        N6_6 myclass = new N6_6();

        //myclass.testHashMap();
        //myclass.testHashMap2();
        myclass.testLinkedHashMap();
        //myclass.testTreeMap();
        //myclass.testTreeMap2();
    }
    public void testHashMap()
    {
        // 创建HashMap对象
        Map<String,Object> map = new HashMap<>();
		// 1、向Map存储键值对元素
		map.put("1", "Jack");        
		map.put("2", "Rose");
		map.put("3", "Lucy");
		map.put("4", "Lucy");
		map.put("1", "Tom");
		System.out.println(map);
		// 2、查看键对象是否存在
		System.out.println(map.containsKey("1"));
		// 3、获取指定键对象映射的值
		System.out.println(map.get("1")); 
		// 4、获取集合中的键对象和值对象集合
		System.out.println(map.keySet()); 
		System.out.println(map.values());
		// 5、替换指定键对象映射的值
		map.replace("1", "Tom2");
		System.out.println(map);
		// 6、删除指定键对象映射的键值对元素
		map.remove("1");
		System.out.println(map);
    }

    //遍历
    public void testHashMap2()
    {
        Map map = new HashMap();            // 创建Map集合
		map.put("1", "Jack");               // 存储元素
		map.put("2", "Rose");
		map.put("3", "Lucy");
		System.out.println(map);
        Iterator it;

        System.out.println("\n使用keySet()方法");
		// 1、使用keySet()方法
		Set keySet = map.keySet();         // 获取键的集合
		it = keySet.iterator();   // 迭代键的集合
		while (it.hasNext()) {
			Object key = it.next();
			Object value = map.get(key);   // 获取每个键所对应的值
			System.out.println(key + ":" + value);
		}
        
        System.out.println("\n使用entrySet()方法");
		// 2、使用entrySet()方法
		Set entrySet = map.entrySet();
		it = entrySet.iterator();            // 获取Iterator对象
		while (it.hasNext()) {
              // 获取集合中键值对映射关系
			Map.Entry entry = (Map.Entry) (it.next());
			Object key = entry.getKey();              // 获取Entry中的键
			Object value = entry.getValue();          // 获取Entry中的值
			System.out.println(key + ":" + value);
		}

        System.out.println("\n使用 foreach 方法");
        //3.使用 foreach 方法
        map.forEach((key,value) -> System.out.println(key + ":" + value));

        System.out.println("\n使用values()方法");
        //4. values 方法
        Collection values = map.values(); // 获取Map集合中value值集合对象
		// 遍历Map集合所有值对象V
		values.forEach(v -> System.out.println(v));
    }

    public void testLinkedHashMap()
    {
        Map map1 = new HashMap();         // 创建HashMap集合
		map1.put(2, "Rose");
		map1.put(1, "Jack"); 
		map1.put(3, "Lucy");
		map1.forEach((key,value) -> System.out.println(key + ":" + value));
		System.out.println("=====================");
		Map map2 = new LinkedHashMap(); // 创建LinkedHashMap集合
		map2.put(2, "Rose");
		map2.put(1, "Jack"); 
		map2.put(3, "Lucy");
		map2.forEach((key,value) -> System.out.println(key + ":" + value));
    }

    public void testTreeMap()
    {
        Map map = new TreeMap();  
		map.put("2", "Rose");
		map.put("1", "Jack");
		map.put("3", "Lucy");
		System.out.println(map);
    }

    public void testTreeMap2()
    {
        Map map = new TreeMap(new CustomComparator()); // 创建TreeMap集合
		map.put("2", "Rose");
		map.put("1", "Jack");
		map.put("3", "Lucy");
		System.out.println(map);

    }
}

class CustomComparator implements Comparator { // 自定义比较器
	public int compare(Object obj1, Object obj2) {
		String key1 = (String) obj1;   // 将Object类型的参数强转为String类型
		String key2 = (String) obj2;
		return key2.compareTo(key1);   // 将比较之后的值返回
	}
}
